home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************
- *
- * ENCODE Version 48
- *
- ******************************************************************
- *
- * Quantize LPC parameters for transmission
- *
- * INPUTS:
- * ORDER - Number of RC's
- * VOICE - Half frame voicing decisions
- * PITCH - Pitch
- * RMS - Energy
- * RC - Reflection coefficients
- * CORRP - Error Correction: TRUE = yes, FALSE = none
- * OUTPUTS:
- * IPITCH - Coded pitch and voicing
- * IRMS - Quantized energy
- * IRC - Quantized reflection coefficients
- *
- */
-
- #include "config.ch"
- #include "lpcdefs.h"
- #include <math.h>
-
- int enctab[16]={0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15};
- int entau[60]={19,11,27,25,29,21,23,22,30,14,15,7,39,
- 38,46,42,43,41,45,37,53,49,51,50,54,52,
- 60,56,58,26,90,88,92,84,86,82,83,81,85,
- 69,77,73,75,74,78,70,71,67,99,97,113,112,
- 114,98,106,104,108,100,101,76};
- int enadd[8]={1920,-768,2432,1280,3584,1536,2816,-1152};
- float enscl[8]={.0204,.0167,.0145,.0147,.0143,.0135,.0125,.0112};
- int enbits[8]={6,5,4,4,4,4,3,3};
- int entab6[64]={0,0,0,0,0,0,1,1,1,1,1,1,1,
- 2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,
- 5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,
- 9,9,9,10,10,11,11,12,13,14,15};
- int rmst[64]={1024,936,856,784,718,656,600,550,
- 502,460,420,384,352,328,294,270,
- 246,226,206,188,172,158,144,132,
- 120,110,102,92,84,78,70,64,
- 60,54,50,46,42,38,34,32,
- 30,26,24,22,20,18,17,16,
- 15,14,13,12,11,10,9,8,
- 7,6,5,4,3,2,1,0};
-
-
- encode(voice, pitch, rms, rc, ipitch, irms, irc )
- int voice[2], *pitch;
- float *rms, rc[ORDER];
- int *ipitch, *irms, irc[ORDER];
- {
- int i, j, i2, i3, mrk, nbit, idel;
- float ftemp;
- int itemp;
-
- /* Scale RMS and RC's to integers */
-
- *irms = *rms;
-
- for(i=1;i<=ORDER;i++)
- irc[i] = rc[i] * 32768;
-
-
- /* Encode pitch and voicing */
-
- if(voice[1]!=0&&voice[2]!=0)
- *ipitch = entau[*pitch-1];
- else
- *ipitch = 0;
- if(voice[1]!=voice[2]) *ipitch = 127;
-
- /* Encode RMS by binary table search */
-
- j = 32;
- idel = 16;
- *irms = mmin(*irms,1023);
- while(idel>0) {
- if (*irms>rmst[j-1]) j -= idel;
- if (*irms<rmst[j-1]) j += idel;
- idel *= 0.5;
- }
- if (*irms>rmst[j-1]) j--;
- *irms = 31 - j*0.5;
-
- /* Encode RC(1) and (2) as log-area-ratios */
-
- for(i=1;i<=2;i++) {
- i2 = irc[i];
- mrk = 0;
- if(i2<0) {
- i2 = -i2 ;
- mrk = 1;
- }
- i2 = i2>>9;
- i2 = mmin(i2,63);
- i2 = entab6[i2];
- if(mrk!=0) i2 = -i2;
- irc[i] = i2;
- }
-
- /* Encode RC(3) - (10) linearly, remove bias then scale */
-
- for(i=3;i<=ORDER;i++) {
- i2 = irc[i]>>1;
- /* i2 = (i2+enadd[ORDER-i])*enscl[ORDER-i]; */
- /* problem with truncating negative numbers */
- if(enadd[ORDER-i] < 0) {
- ftemp = -(i2+enadd[ORDER-i])*enscl[ORDER-i];
- itemp = ftemp;
- i2 = -itemp;
- }
- else
- i2 = (i2+enadd[ORDER-i])*enscl[ORDER-i];
-
- /***** i2 = mmin(mmax(i2,-127),127); *****/
- if( (i2 < -127) || (i2 > 127))
- if(i2 < -127)
- i2 = -127;
- else
- if (i2> 127)
- i2 = 127;
-
- nbit = enbits[ORDER-i];
- i3 = 0;
- if(i2<0) i3 = -1;
- /*i2 = i2/pow(2.,(float)nbit);*/
- i2 = i2 / (2 << (nbit-1));
- if(i3==-1) i2--;
- irc[i] = i2;
- }
-
- /* Protect the most significant bits of the most
- * important parameters during non-voiced frames.
- * RC(1) - RC(4) are protected using 20 parity bits
- * replacing RC(5) - RC(10). */
-
- if(*ipitch==0||*ipitch==127) {
- irc[5] = enctab[(irc[1]&30)>>1];
- irc[6] = enctab[(irc[2]&30)>>1];
- irc[7] = enctab[(irc[3]&30)>>1];
- irc[8] = enctab[(*irms&30)>>1];
- irc[9] = enctab[(irc[4]&30)>>1]>>1;
- irc[10]= enctab[(irc[4]&30)>>1]&1;
- }
-
- }
-